package cn.lhl01.util;

import cn.lhl01.common.Results;
import com.alibaba.fastjson2.JSON;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class Utils {


	/**
	 * 通过response响应返回Results
	 *
	 * @param response
	 * @param results
	 * @throws IOException
	 */
	public static void results(HttpServletResponse response, Results results) throws IOException {
		response.setContentType("application/json;charset=utf-8");
		PrintWriter writer = response.getWriter();
		writer.write(JSON.toJSONString(results));
		writer.flush();
		writer.close();
	}

	/**
	 * 获取客户端的真实IP地址
	 * <p>
	 * 一般情况下通过request.getRemoteAddr()就可取得客户端的IP地址,
	 * 但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
	 * 如果使用了反向代理软件，将http://192.168.0.202:7009/ 的URL反向代理为http://www.xxx.com/
	 * 的URL时， 用request.getRemoteAddr()方法获取的IP地址是：127.0.0.1　或　192.168.0.203，
	 * 而并不是客户端的真实ＩＰ。 经过代理以后，由于在客户端和服务之间增加了中间层，因此服务器无法直接拿到客户端的IP，服务器端应用也无法
	 * 直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中，增加了X－FORWARDED－FOR信息用以跟踪原有
	 * 的客户端IP地址和原来客户端请求的服务器地址。原来如此，我们的项目中正好是有前置apache，将一些请求转发给后端的weblogic，
	 * 看来就是这样导致的。
	 *
	 * @param request
	 * @return
	 */
	public static String getRemoteAddr(HttpServletRequest request) {
		String ip = request.getHeader("x-forwarded-for");
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("WL-Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
		}
		return ip;
	}
}
